<?php

$threeshold_padrao = 20;
$tolerancia = 10;

include_once("qvoipm.php"); 

/* calcula fim da chamada */
function calc_fim($item)
{
	return ($item['aberta'] == FALSE)? strtotime($item[5]) :
		(strtotime($item[4]) + ($item['frequencia'] * ($item['nPacotes']+$tolerancia))/1000);
}

/* Pega dados por parametro */
$tipo = ($_GET['tipo'])? $_GET['tipo'] : "fatorR";
$width = 900;
$height = 300;

/* Verifica data de inicio e fim para pegar as chamadas */
$inicio = $_GET['inicio'] or die("sem data inicial");
$fim = $_GET['fim'] or die("sem data final");

/* calcula precisao */
$divisoes = 500;


if ($fim - $inicio < $divisoes)
{
	$precisao = 1;
	$formato = "H:i:s";
}
else if ($fim - $inicio < $divisoes * 60)
{
	$precisao = 60;
	$formato = "H:i";
}
else if ($fim - $inicio < $divisoes * 60*60)
{
	$precisao = 60*60;
	$formato = "d/M g a";
}
else if ($fim - $inicio < $divisoes * 60*60*24)
{
	$precisao = 60*60*24;
	$formato = "d/M/Y";
}
else if ($fim - $inicio < $divisoes * 60*60*24*30)
{
	$precisao = 60*60*24*30;
	$formato = "M/Y";
}
else
{
	$precisao = 60*60*24*30*365;
	$formato = "M/Y";
}

/* tolerancia (somente fator-R) */
$threeshold = ($_GET['threeshold'])? $_GET['threeshold'] : $threeshold_padrao;

/* pega chamadas no intervalo */
$banco = new QVOIPM();
$banco->getChamadasFromUntil($inicio, $fim);

/* intervalo de tempo inicial */
$t_inicio = $inicio;
$t_fim = $t_inicio + $precisao;

/* cria dados do grafico */
$has_chamadas = TRUE;

$abertos = array();
$conjunto = new ArrayObject($abertos);
$last_item = NULL;
$n = 0;

while ($has_chamadas)
{
	/* verifica quem sai do conjunto de trabalho */	
	for ($i = $conjunto->getIterator(); $i->valid(); $i->next())
	{
		$item = $i->current();

		if ($item['inicio'] > $t_fim || $item['fim'] < $t_inicio)
		{
			$conjunto->offsetUnset($i->key());
		}
		else
			break;
	}

	/* verifica quem entra no conjunto de trabalho */
	while (TRUE)
	{
		if (! ($item = ($last_item != NULL)? $last_item : $banco->getResult()))
		{
			$has_chamadas = FALSE;
			break;
		}
		else if (calc_fim($item) >= $t_inicio && strtotime($item[4]) <= $t_fim)
		{
			$conjunto->offsetSet($item['id'], 
			array('inicio' => strtotime($item[4]), 'fim' => calc_fim($item), 'valor' => $item["s" . ucfirst($tipo)]/$item['nPacotes']));
		}
		else 
		{
			$last_item = $item;
			break;
		}
		$last_item = NULL;
	}
	
	if ($conjunto->count() > 0)
	{
		/* calcula media */
		$media = 0;
		for ($i = $conjunto->getIterator(); $i->valid(); $i->next())
		{
			$item = $i->current();
			$media += $item['valor'];
		}

		$media /= $conjunto->count();

		/* coloca dados do grafico */
		$dados[] = ($tipo == "fatorR" && $threeshold > 0 && ($t_inicio <= $inicio || !$has_chamadas))?
				array(date($formato, $t_inicio), $t_inicio, $media, $threeshold) :
				array(date($formato, $t_inicio), $t_inicio, $media);
		$n++;
	}

	/* proximo intervalo de tempo */
	$t_inicio = $t_fim;
	$t_fim += $precisao;
}

if ($n == 1)
	$dados[] = array(date($formato, $fim), $fim, $media, ($tipo == "fatorR" && $threeshold > 0)? $threeshold : '');

require_once 'phplot.php';
$plot =& new PHPlot($width, $height);

$plot->SetDataColors(array('blue', 'red'));
$plot->SetMarginsPixels(70, 30, 20, 80);
$plot->SetImageBorderType('plain');
$plot->SetXLabelAngle(90);
$plot->SetPlotType('linepoints');
$plot->SetDataType('data-data');
$plot->SetDataValues($dados);
$plot->SetPlotAreaWorld($inicio, NULL, $fim, NULL);
$plot->SetPlotBorderType('none');

# Main plot title:
$plot->SetTitle("Chamadas VOIP");
$plot->SetXTitle("tempo");
$plot->SetYTitle("$tipo(Media)");

# Make sure Y axis starts at 0:
$plot->SetPlotAreaWorld(NULL, 0, NULL, NULL);

$plot->DrawGraph();

?>

